/**
 *
 */
package siebes.rmi.sorter;

import java.rmi.RemoteException;
import java.util.Random;

/**
 * @author eddie
 *Levert utilities voor met name de Sortclient.
 *Voor leesbaarheid en testbaarheid aparte klasse gemaakt.
 */
public class ComparableSupplier {

    /**
     * @return random string met een max lengte van 20.
     * @TODO dit kan beter. Nu nog met enters enzo.
     */
    public final String createRandomString() {
        final int maxStrLength = 20;
        final int maxByteNumber = 256;
        Random randomGenerator = new Random();
        int strLength = randomGenerator.nextInt(maxStrLength);
        char[] charList = new char[strLength];
        for (int j = 0; j < strLength; j++) {
            int asciiNr = randomGenerator.nextInt(maxByteNumber);
            charList[j] = Character.toChars(asciiNr)[0];
        }
        String s = "";
        for (Character c : charList) {
            s += c;
        }
        return s;
    }

    /**
     * Genereer een lijst met willekeurige strings.
     * @param listLength lengthe array
     * @return een lijst met strings
     */
    @SuppressWarnings("rawtypes")
    public final Comparable[] generateRandomStrings(final int listLength) {
        String[] templistStrings = new String[listLength];
        for (int i = 0; i < listLength; i++) {
            templistStrings[i] = createRandomString();
        }
        return templistStrings;
    }

    /**
     * @param listLength lengte van de lijst
     * @return een lijst met random kompeertjes
     * @throws RemoteException voor RMI
     */
    @SuppressWarnings("rawtypes")
    public final Comparable[] generateRandomKomPeertjes(final int listLength)
            throws RemoteException {
        KomPeertje[] kompeertjes = new KomPeertje[listLength];
        for (int i = 0; i < listLength; i++) {
            String tempString = createRandomString();
            int tempInt = createRandomInteger(listLength);
            kompeertjes[i] = new KomPeertje(tempString, tempInt);
        }
        return kompeertjes;
    }

    /**
     *Generereer een lijst met willekeurige nummer (integers).
     *De integers zijn tussen de 0 en de 1000.
     * @param listLength lengte array
     * @return een lijst met integers.
     */
    @SuppressWarnings("rawtypes")
    public final Comparable[] generateRandomIntegers(final int listLength) {
        Integer[] templistIntegers = new Integer[listLength];
        for (int i = 0; i < listLength; i++) {
          templistIntegers[i] = createRandomInteger(listLength);
        }
        return templistIntegers;
    }

    /**
     * @return random int
     * @param maxNumber maximale grootte getal.
     */
    public final Integer createRandomInteger(final int maxNumber) {
        Random randomGenerator = new Random();
        return randomGenerator.nextInt(maxNumber);
    }

    /**
     * @param listLength lengte van de lijst.
     * @param type Klasse type
     * @return random lijst
     * @throws RemoteException ivm rmi
     */
    @SuppressWarnings("rawtypes")
    public final Comparable[] generateRandomList(
            final int listLength, final Class type)
                    throws RemoteException {

        if (type.getSimpleName().equalsIgnoreCase("String")) {
            return generateRandomStrings(listLength);
        } else if (type.getSimpleName().equalsIgnoreCase("Integer")) {
            return generateRandomIntegers(listLength);
        } else if (type.getSimpleName().equalsIgnoreCase("KomPeertje")) {
            return generateRandomKomPeertjes(listLength);
        } else {
            throw new IllegalArgumentException("Deze klasse is niet bekend.");
        }
    }

}
